<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

/**
 * 后台公共文件
 * 主要定义后台公共函数库
 */

/* 解析列表定义规则*/

function get_list_field($data, $grid, $model) {

	// 获取当前字段数据
	foreach ($grid['field'] as $field) {
		$array = explode('|', $field);
		$temp = $data[$array[0]];
		// 函数支持
		if (isset($array[1])) {
			$temp = call_user_func($array[1], $temp);
		}
		$data2[$array[0]] = $temp;
	}
	if (!empty($grid['format'])) {
		$value = preg_replace_callback('/\[([a-z_]+)\]/', function ($match) use ($data2) {return $data2[$match[1]];}, $grid['format']);
	} else {
		$value = implode(' ', $data2);
	}

	// 链接支持
	if (!empty($grid['href'])) {
		$links = explode(',', $grid['href']);
		foreach ($links as $link) {
			$array = explode('|', $link);
			$href = $array[0];
			if (preg_match('/^\[([a-z_]+)\]$/', $href, $matches)) {
				$val[] = $data2[$matches[1]];
			} else {
				$show = isset($array[1]) ? $array[1] : $value;
				// 替换系统特殊字符串
				$href = str_replace(
					array('[DELETE]', '[EDIT]', '[MODEL]'),
					array('del?ids=[id]&model=[MODEL]', 'edit?id=[id]&model=[MODEL]', $model['id']),
					$href);

				// 替换数据变量
				$href = preg_replace_callback('/\[([a-z_]+)\]/', function ($match) use ($data) {return $data[$match[1]];}, $href);

				$val[] = '<a href="' . U($href) . '">' . $show . '</a>';
			}
		}
		$value = implode(' ', $val);
	}
	return $value;
}

// 获取模型名称
function get_model_by_id($id) {
	return $model = M('Model')->getFieldById($id, 'title');
}

// 获取属性类型信息
function get_attribute_type($type = '') {
	// TODO 可以加入系统配置
	static $_type = array(
		'num' => array('数字', 'int(10) UNSIGNED NOT NULL'),
		'string' => array('字符串', 'varchar(255) NOT NULL'),
		'textarea' => array('文本框', 'text NOT NULL'),
		'datetime' => array('时间', 'int(10) NOT NULL'),
		'bool' => array('布尔', 'tinyint(2) NOT NULL'),
		'select' => array('枚举', 'char(50) NOT NULL'),
		'radio' => array('单选', 'char(10) NOT NULL'),
		'checkbox' => array('多选', 'varchar(100) NOT NULL'),
		'editor' => array('编辑器', 'text NOT NULL'),
		'picture' => array('上传图片', 'int(10) UNSIGNED NOT NULL'),
		'file' => array('上传附件', 'int(10) UNSIGNED NOT NULL'),
	);
	return $type ? $_type[$type][0] : $_type;
}

/**
 * 获取对应状态的文字信息
 * @param int $status
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_status_title($status = null) {
	if (!isset($status)) {
		return false;
	}
	switch ($status) {
	case -1:return '已删除';
		break;
	case 0:return '禁用';
		break;
	case 1:return '正常';
		break;
	case 2:return '待审核';
		break;
	default:return false;
		break;
	}
}

// 获取数据的状态操作
function show_status_op($status) {
	switch ($status) {
	case 0:return '启用';
		break;
	case 1:return '禁用';
		break;
	case 2:return '审核';
		break;
	default:return false;
		break;
	}
}

/**
 * 获取文档的类型文字
 * @param string $type
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_document_type($type = null) {
	if (!isset($type)) {
		return false;
	}
	switch ($type) {
	case 1:return '目录';
		break;
	case 2:return '主题';
		break;
	case 3:return '段落';
		break;
	default:return false;
		break;
	}
}

/**
 * 获取配置的类型
 * @param string $type 配置类型
 * @return string
 */
function get_config_type($type = 0) {
	$list = C('CONFIG_TYPE_LIST');
	return $list[$type];
}

/**
 * 获取配置的分组
 * @param string $group 配置分组
 * @return string
 */
function get_config_group($group = 0) {
	$list = C('CONFIG_GROUP_LIST');
	return $group ? $list[$group] : '';
}

/**
 * select返回的数组进行整数映射转换
 *
 * @param array $map  映射关系二维数组  array(
 *                                          '字段名1'=>array(映射关系数组),
 *                                          '字段名2'=>array(映射关系数组),
 *                                           ......
 *                                       )
 * @author 朱亚杰 <zhuyajie@topthink.net>
 * @return array
 *
 *  array(
 *      array('id'=>1,'title'=>'标题','status'=>'1','status_text'=>'正常')
 *      ....
 *  )
 *
 */
function int_to_string(&$data, $map = array('status' => array(1 => '正常', -1 => '删除', 0 => '禁用', 2 => '未审核', 3 => '草稿'))) {
	if ($data === false || $data === null) {
		return $data;
	}
	$data = (array) $data;
	foreach ($data as $key => $row) {
		foreach ($map as $col => $pair) {
			if (isset($row[$col]) && isset($pair[$row[$col]])) {
				$data[$key][$col . '_text'] = $pair[$row[$col]];
			}
		}
	}
	return $data;
}

/**
 * 动态扩展左侧菜单,base.html里用到
 * @author 朱亚杰 <zhuyajie@topthink.net>
 */
function extra_menu($extra_menu, &$base_menu) {
	foreach ($extra_menu as $key => $group) {
		if (isset($base_menu['child'][$key])) {
			$base_menu['child'][$key] = array_merge($base_menu['child'][$key], $group);
		} else {
			$base_menu['child'][$key] = $group;
		}
	}
}

/**
 * 获取参数的所有父级分类
 * @param int $cid 分类id
 * @return array 参数分类和父类的信息集合
 * @author huajie <banhuajie@163.com>
 */
function get_parent_category($cid) {
	if (empty($cid)) {
		return false;
	}
	$cates = M('Category')->where(array('status' => 1))->field('id,title,pid')->order('sort')->select();
	$child = get_category($cid); //获取参数分类的信息
	$pid = $child['pid'];
	$temp = array();
	$res[] = $child;
	while (true) {
		foreach ($cates as $key => $cate) {
			if ($cate['id'] == $pid) {
				$pid = $cate['pid'];
				array_unshift($res, $cate); //将父分类插入到数组第一个元素前
			}
		}
		if ($pid == 0) {
			break;
		}
	}
	return $res;
}

/**
 * 检测验证码
 * @param  integer $id 验证码ID
 * @return boolean     检测结果
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function check_verify($code, $id = 1) {
	$verify = new \Think\Verify();
	return $verify->check($code, $id);
}

/**
 * 获取当前分类的文档类型
 * @param int $id
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_type_bycate($id = null) {
	if (empty($id)) {
		return false;
	}
	$type_list = C('DOCUMENT_MODEL_TYPE');
	$model_type = M('Category')->getFieldById($id, 'type');
	$model_type = explode(',', $model_type);
	foreach ($type_list as $key => $value) {
		if (!in_array($key, $model_type)) {
			unset($type_list[$key]);
		}
	}
	return $type_list;
}

/**
 * 获取当前文档的分类
 * @param int $id
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_cate($cate_id = null) {
	if (empty($cate_id)) {
		return false;
	}
	$cate = M('Category')->where(array('id' => $cate_id))->getField('title');
	return $cate;
}

// 分析枚举类型配置值 格式 a:名称1,b:名称2
function parse_config_attr($string) {
	$array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
	if (strpos($string, ':')) {
		$value = array();
		foreach ($array as $val) {
			list($k, $v) = explode(':', $val);
			$value[$k] = $v;
		}
	} else {
		$value = $array;
	}
	return $value;
}

// 获取子文档数目
function get_subdocument_count($id = 0) {
	return M('Document')->where(array('pid' => $id))->count();
}

// 分析枚举类型字段值 格式 a:名称1,b:名称2
// 暂时和 parse_config_attr功能相同
// 但请不要互相使用，后期会调整
function parse_field_attr($string) {
	if (0 === strpos($string, ':')) {
		// 采用函数定义
		return eval(substr($string, 1) . ';');
	}
	$array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
	if (strpos($string, ':')) {
		$value = array();
		foreach ($array as $val) {
			list($k, $v) = explode(':', $val);
			$value[$k] = $v;
		}
	} else {
		$value = $array;
	}
	return $value;
}

/**
 * 获取行为数据
 * @param string $id 行为id
 * @param string $field 需要获取的字段
 * @author huajie <banhuajie@163.com>
 */
function get_action($id = null, $field = null) {
	if (empty($id) && !is_numeric($id)) {
		return false;
	}
	$list = S('action_list');
	if (empty($list[$id])) {
		$map = array('status' => array('gt', -1), 'id' => $id);
		$list[$id] = M('Action')->where($map)->field(true)->find();
	}
	return empty($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据条件字段获取数据
 * @param mixed $value 条件，可用常量或者数组
 * @param string $condition 条件字段
 * @param string $field 需要返回的字段，不传则返回整个数据
 * @author huajie <banhuajie@163.com>
 */
function get_document_field($value = null, $condition = 'id', $field = null) {
	if (empty($value)) {
		return false;
	}

	//拼接参数
	$map[$condition] = $value;
	$info = M('Model')->where($map);
	if (empty($field)) {
		$info = $info->field(true)->find();
	} else {
		$info = $info->getField($field);
	}
	return $info;
}

/**
 * 获取行为类型
 * @param intger $type 类型
 * @param bool $all 是否返回全部类型
 * @author huajie <banhuajie@163.com>
 */
function get_action_type($type, $all = false) {
	$list = array(
		1 => '系统',
		2 => '用户',
	);
	if ($all) {
		return $list;
	}
	return $list[$type];
}
